From eaa32090b9c214106ee1b094c2a1b801516b055f Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Mon, 15 Jul 2019 13:52:58 -0400 Subject: [PATCH] appDisplay: Don't leak duplicate items in AppView If an icon already exists in an app view with the same id, the duplicate is not added on a call to addItem. Unfortunately, since it's not added, the icon actor gets orphaned and leaked. This commit address the problem by introducing a new hasItem method and disallowing callers to call addItem with a duplicate in the first place. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/628 --- js/ui/appDisplay.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js index 8bfdd1707..cd7a23e96 100644 --- a/js/ui/appDisplay.js +++ b/js/ui/appDisplay.js @@ -128,10 +128,14 @@ class BaseAppView { return this._allItems; } + hasItem(id) { + return this._items[id] !== undefined; + } + addItem(icon) { let id = icon.id; - if (this._items[id] !== undefined) - return; + if (this.hasItem(id)) + throw new Error(`icon with id ${id} already added to view`) this._allItems.push(icon); this._items[id] = icon; @@ -371,6 +375,8 @@ var AllView = class AllView extends BaseAppView { let folders = this._folderSettings.get_strv('folder-children'); folders.forEach(id => { + if (this.hasItem(id)) + return; let path = this._folderSettings.path + 'folders/' + id + '/'; let icon = new FolderIcon(id, path, this); icon.connect('name-changed', this._itemNameChanged.bind(this)); @@ -1151,6 +1157,9 @@ var FolderIcon = class FolderIcon { let excludedApps = this._folder.get_strv('excluded-apps'); let appSys = Shell.AppSystem.get_default(); let addAppId = appId => { + if (this.view.hasItem(appId)) + return; + if (excludedApps.includes(appId)) return; -- 2.39.5